package main

import "fmt"

/*
定义了一个对象的行为规范，
只定义规范不实现，
由具体的对象来实现规范的细节
*/
type Sayer interface {
	say()
}

type Mover interface {
	move()
}

// 一个类型实现多个接口
func (d dog) say() {
	fmt.Printf("%s会叫汪汪汪\n", d.name)
}

func (d dog) move() {
	fmt.Printf("%s会动\n", d.name)
}

// 值接收者
//func (d dog) move() {
//	fmt.Println("狗会动")
//}

// 指针接收者
//
//	func (d *dog) move() {
//		fmt.Println("狗会动")
//	}
func (c cat) say() {
	fmt.Println("喵喵喵")
}

type dog struct {
	name string
}
type cat struct{}

func main() {
	var x Sayer // 声明一个Sayer类型的变量x
	a := cat{}
	b := dog{}
	x = a
	x.say()
	x = b
	x.say()

	var y Mover
	//var d1 = dog{} // 旺财是dog类型
	//y = d1
	//y.move()
	var d2 = &dog{} // 富贵是*dog类型
	y = d2
	y.move()

	var d3 = dog{name: "dog3"}
	x = d3
	x.say()
	y = d3
	y.move()
}
